package cn.jly.bigdata.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author lanyangji
 * @date 2019/11/24 10:47
 */
object Spark02_expr12 {

  def main(args: Array[String]): Unit = {

    // local模式

    // 创建 SparkConf 对象
    // 这边也自定义了本地的模式（分配多少个cpu）
    // app id
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")

    // 创建spark上下文对象，SparkContext -> sc
    val sc = new SparkContext(sparkConf)

    val listRDD: RDD[Int] = sc.makeRDD(1 to 5, 3)

    val listRDD2: RDD[Int] = sc.makeRDD(3 to 7, 3)

    // union算子，求两个RDD的并集
    // 两个RDD需要类型相匹配
    val unionRDD: RDD[Int] = listRDD.union(listRDD2)

    println(unionRDD.collect.mkString(","))

    println

    val listRDD4: RDD[Any] = sc.makeRDD(List[Any]())
    val listRDD3: RDD[Any] = sc.makeRDD(List("hello", 1, 2.3))
    println(listRDD4.union(listRDD3).collect.mkString(","))

    // subtract算子，求差集
    println(listRDD.subtract(listRDD2).collect.mkString(","))

    // intersection算子，求交集
    println(listRDD.intersection(listRDD2).collect.mkString(","))

    // 笛卡尔积
    println(listRDD.cartesian(listRDD2).collect.mkString(","))

    // zip算子，两个rdd的相同位置元素组成k-v对
    // 要求两个RDD的分区数目和元素个数完全一致，否则会报出异常
    println(listRDD.zip(listRDD2).collect.mkString(","))
  }
}
